Hrvatski

Otključajte moć GraphQL Federacije pomoću Schema Stitchinga. Naučite kako izgraditi jedinstveni GraphQL API iz više servisa, poboljšavajući skalabilnost i održivost.

GraphQL Federacija: Schema Stitching - Sveobuhvatan Vodič

U neprestano razvijajućem krajoliku modernog razvoja aplikacija, potreba za skalabilnim i održivim arhitekturama postala je ključna. Mikroservisi, sa svojom inherentnom modularnošću i neovisnom mogućnošću postavljanja, pojavili su se kao popularno rješenje. Međutim, upravljanje brojnim mikroservisima može uvesti složenosti, osobito kada je riječ o izlaganju jedinstvenog API-ja klijentskim aplikacijama. Tu na scenu stupa GraphQL Federacija, a posebno Schema Stitching.

Što je GraphQL Federacija?

GraphQL Federacija je moćna arhitektura koja vam omogućuje izgradnju jednog, jedinstvenog GraphQL API-ja iz više temeljnih GraphQL servisa (koji često predstavljaju mikroservise). Omogućuje programerima da dohvaćaju podatke s različitih servisa kao da je riječ o jednom grafu, pojednostavljujući iskustvo klijenta i smanjujući potrebu za složenom logikom orkestracije na klijentskoj strani.

Postoje dva primarna pristupa GraphQL Federaciji:

Ovaj članak se fokusira na Schema Stitching, istražujući njegove koncepte, prednosti, ograničenja i praktičnu implementaciju.

Razumijevanje Schema Stitchinga

Schema Stitching je proces spajanja više GraphQL shema u jednu, kohezivnu shemu. Ova jedinstvena shema djeluje kao fasada, skrivajući složenost temeljnih servisa od klijenta. Kada klijent pošalje zahtjev na spojenu shemu, gateway inteligentno usmjerava zahtjev na odgovarajući temeljni servis(e), dohvaća podatke i kombinira rezultate prije nego što ih vrati klijentu.

Zamislite to ovako: Imate više restorana (servisa), od kojih je svaki specijaliziran za različite kuhinje. Schema Stitching je poput univerzalnog jelovnika koji kombinira sva jela iz svakog restorana. Kada kupac (klijent) naruči s univerzalnog jelovnika, narudžba se inteligentno usmjerava u odgovarajuće kuhinje restorana, hrana se priprema, a zatim kombinira u jednu dostavu za kupca.

Ključni koncepti u Schema Stitchingu

Prednosti Schema Stitchinga

Schema Stitching nudi nekoliko uvjerljivih prednosti za organizacije koje usvajaju arhitekturu mikroservisa:

Ograničenja Schema Stitchinga

Iako Schema Stitching nudi brojne prednosti, važno je biti svjestan njegovih ograničenja:

Praktična implementacija Schema Stitchinga

Prođimo kroz pojednostavljeni primjer kako implementirati Schema Stitching koristeći Node.js i biblioteku graphql-tools (popularan izbor za schema stitching). Ovaj primjer uključuje dva mikroservisa: User Service (Servis za korisnike) i Product Service (Servis za proizvode).

1. Definirajte udaljene sheme

Prvo, definirajte GraphQL sheme za svaki od udaljenih servisa.

Servis za korisnike (user-service.js):


const { buildSchema } = require('graphql');

const userSchema = buildSchema(`
  type User {
    id: ID!
    name: String
    email: String
  }

  type Query {
    user(id: ID!): User
  }
`);

const users = [
  { id: '1', name: 'Alice Smith', email: 'alice@example.com' },
  { id: '2', name: 'Bob Johnson', email: 'bob@example.com' },
];

const userRoot = {
  user: (args) => users.find(user => user.id === args.id),
};

module.exports = {
  schema: userSchema,
  rootValue: userRoot,
};

Servis za proizvode (product-service.js):


const { buildSchema } = require('graphql');

const productSchema = buildSchema(`
  type Product {
    id: ID!
    name: String
    price: Float
    userId: ID!  # Strani ključ prema servisu za korisnike
  }

  type Query {
    product(id: ID!): Product
  }
`);

const products = [
  { id: '101', name: 'Laptop', price: 1200, userId: '1' },
  { id: '102', name: 'Smartphone', price: 800, userId: '2' },
];

const productRoot = {
  product: (args) => products.find(product => product.id === args.id),
};

module.exports = {
  schema: productSchema,
  rootValue: productRoot,
};

2. Kreirajte Gateway servis

Sada, kreirajte gateway servis koji će spojiti dvije sheme zajedno.

Gateway servis (gateway.js):


const { stitchSchemas } = require('@graphql-tools/stitch');
const { makeRemoteExecutableSchema } = require('@graphql-tools/wrap');
const { graphqlHTTP } = require('express-graphql');
const express = require('express');
const { introspectSchema } = require('@graphql-tools/wrap');
const { printSchema } = require('graphql');
const fetch = require('node-fetch');

async function createRemoteSchema(uri) {
  const fetcher = async (params) => {
    const response = await fetch(uri, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify(params),
    });
    return response.json();
  };

  const schema = await introspectSchema(fetcher);
  return makeRemoteExecutableSchema({
    schema,
    fetcher,
  });
}

async function main() {
  const userSchema = await createRemoteSchema('http://localhost:4001/graphql');
  const productSchema = await createRemoteSchema('http://localhost:4002/graphql');

  const stitchedSchema = stitchSchemas({
    subschemas: [
      { schema: userSchema },
      { schema: productSchema },
    ],
    typeDefs: `
      extend type Product {
        user: User
      }
    `,
    resolvers: {
      Product: {
        user: {
          selectionSet: `{ userId }`,
          resolve(product, args, context, info) {
            return info.mergeInfo.delegateToSchema({
              schema: userSchema,
              operation: 'query',
              fieldName: 'user',
              args: {
                id: product.userId,
              },
              context,
              info,
            });
          },
        },
      },
    },
  });

  const app = express();
  app.use('/graphql', graphqlHTTP({
    schema: stitchedSchema,
    graphiql: true,
  }));

  app.listen(4000, () => console.log('Gateway poslužitelj pokrenut na http://localhost:4000/graphql'));
}

main().catch(console.error);

3. Pokrenite servise

Morat ćete pokrenuti Servis za korisnike i Servis za proizvode na različitim portovima. Na primjer:

Servis za korisnike (port 4001):


const express = require('express');
const { graphqlHTTP } = require('express-graphql');
const { schema, rootValue } = require('./user-service');

const app = express();
app.use('/graphql', graphqlHTTP({
  schema: schema,
  rootValue: rootValue,
  graphiql: true,
}));

app.listen(4001, () => console.log('Servis za korisnike pokrenut na http://localhost:4001/graphql'));

Servis za proizvode (port 4002):


const express = require('express');
const { graphqlHTTP } = require('express-graphql');
const { schema, rootValue } = require('./product-service');

const app = express();
app.use('/graphql', graphqlHTTP({
  schema: schema,
  rootValue: rootValue,
  graphiql: true,
}));

app.listen(4002, () => console.log('Servis za proizvode pokrenut na http://localhost:4002/graphql'));

4. Postavite upit spojenoj shemi

Sada možete postaviti upit spojenoj shemi putem gatewaya (koji radi na portu 4000). Možete pokrenuti upit poput ovog:


query {
  product(id: "101") {
    id
    name
    price
    user {
      id
      name
      email
    }
  }
}

Ovaj upit dohvaća proizvod s ID-jem "101" i također dohvaća povezanog korisnika iz Servisa za korisnike, demonstrirajući kako vam Schema Stitching omogućuje dohvaćanje podataka s više servisa u jednom zahtjevu.

Napredne tehnike Schema Stitchinga

Osim osnovnog primjera, evo nekoliko naprednih tehnika koje se mogu koristiti za poboljšanje vaše implementacije Schema Stitchinga:

Odabir između Schema Stitchinga i Apollo Federacije

Iako je Schema Stitching održiva opcija za GraphQL Federaciju, Apollo Federacija je postala popularniji izbor zbog svojih naprednih značajki i poboljšanog iskustva za programere. Evo usporedbe ova dva pristupa:

Značajka Schema Stitching Apollo Federation
Definicija sheme Koristi postojeći GraphQL jezik shema Koristi deklarativni jezik shema s direktivama
Planiranje upita Zahtijeva ručno delegiranje upita Automatsko planiranje upita od strane Apollo Gatewaya
Proširenja tipova Ograničena podrška Ugrađena podrška za proširenja tipova
Ključne direktive Nije podržano Koristi @key direktivu za identifikaciju entiteta
Distribuirano praćenje Zahtijeva ručnu implementaciju Ugrađena podrška za distribuirano praćenje
Alati i ekosustav Manje zreli alati Zreliji alati i velika zajednica
Složenost Može biti složeno za upravljanje u velikim sustavima Dizajnirano za velike i složene sustave

Kada odabrati Schema Stitching:

Kada odabrati Apollo Federaciju:

Primjeri iz stvarnog svijeta i slučajevi upotrebe

Evo nekoliko primjera iz stvarnog svijeta kako se GraphQL Federacija, uključujući Schema Stitching, može koristiti:

Najbolje prakse za Schema Stitching

Kako biste osigurali uspješnu implementaciju Schema Stitchinga, slijedite ove najbolje prakse:

Zaključak

GraphQL Federacija sa Schema Stitchingom nudi moćan pristup izgradnji jedinstvenih API-ja iz više servisa u arhitekturi mikroservisa. Razumijevanjem njezinih temeljnih koncepata, prednosti, ograničenja i tehnika implementacije, možete iskoristiti Schema Stitching za pojednostavljenje pristupa podacima, poboljšanje skalabilnosti i povećanje održivosti. Iako se Apollo Federacija pojavila kao naprednije rješenje, Schema Stitching ostaje održiva opcija za jednostavnije scenarije ili pri integraciji postojećih GraphQL servisa. Pažljivo razmotrite svoje specifične potrebe i zahtjeve kako biste odabrali najbolji pristup za svoju organizaciju.